home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / iconview.m < prev    next >
Text File  |  1997-10-26  |  12KB  |  407 lines

  1. MODULE IconView;
  2.  
  3. (*$R- Kein Rangecheck *)
  4. (*$S- Kein Stackcheck *)
  5. (*$Z+ Rckgabe ber D0 *)
  6.  
  7.  
  8. (* Dies ist ein einfacher Iconviewer, der die einzelnen Dialoge einer Resource
  9.  * in einem Fenster anzeigt, und zwar inklusive Farbicons 
  10.  * Der Einfachheit halber benutze ich die cat-module hierzu.
  11.  *)
  12.  
  13. FROM SYSTEM IMPORT ADDRESS, ADR;
  14.  
  15. IMPORT Keyboard, MOSGlobals, Strings, FileNames, GrafBase;
  16. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  17.  
  18. FROM Keyboard IMPORT SpecialCode;
  19.  
  20. IMPORT mtAppl, mtRsc, mtUtils, MagicAES, MagicVDI, mtDials, mtCommand,
  21.        mtDir, MagicStrings, MagicCookie;
  22.  
  23. IMPORT WdwManager, CatTypes, RectFuncs;
  24.  
  25. FROM Void IMPORT v;
  26.  
  27.  
  28. CONST
  29.     (* Cookies definieren *)
  30.     FselCookie  = 'FSEL';
  31.     MagiXCookie = 'MagX';
  32.     MultiGEMCookie = 'MGEM';
  33.     MagicMacCookie = 'MgMc';
  34.  
  35. TYPE    VIEW    = RECORD
  36.                     fileName: CatTypes.pathStrType;
  37.                     infoLine: CatTypes.String255;
  38.                     rsc     : mtRsc.RESOURCE;
  39.                     treeIdx : INTEGER;
  40.                     treeCnt : INTEGER;
  41.                     wdw     : INTEGER;
  42.                     vdi     : INTEGER;
  43.                   END;
  44.         viewPtr = POINTER TO VIEW;
  45.  
  46.  
  47. VAR loadPath: CatTypes.pathStrType;
  48.     loadName: CatTypes.nameStrType;
  49.     deskSize: GrafBase.Rectangle;
  50.  
  51. (* Funktionen aus CatGlobal *)    
  52.  
  53. PROCEDURE FselGet(VAR InPath, InSel: ARRAY OF CHAR; REF ext, msg : ARRAY OF CHAR;
  54.                   pathOnly : BOOLEAN):BOOLEAN;
  55. (* Ausgelagert aus CAT.M, da ich die auch im Editor verwenden kann.
  56.  *)
  57. TYPE    fselPtr = POINTER TO RECORD
  58.                     id      : LONGCARD;
  59.                     version : CARDINAL;
  60.                   END;
  61.  
  62. VAR scrapP : CatTypes.pathStrType;
  63.     scrapN : CatTypes.nameStrType;
  64.     l      : CARDINAL;
  65.     fsel   : fselPtr;
  66.     noMCtrl: BOOLEAN;
  67. BEGIN
  68.   mtDir.DelTail (InPath);
  69.   MagicStrings.Assign(InPath, scrapP);
  70.   (*
  71.   l := LENGTH (InPath);
  72.   IF l > 0
  73.   THEN
  74.     IF InPath[l-1] #'\'
  75.     THEN InPath[l-1] := '\';InPath[l] := 0C;
  76.     END;
  77.   END;
  78.   *)
  79.   noMCtrl := MagicCookie.FindCookie (FselCookie, fsel);
  80.   IF noMCtrl
  81.   THEN
  82.     noMCtrl := fsel^.version >= 0200H;
  83.   END;
  84.   MagicStrings.Assign(InSel, scrapN);
  85.   MagicStrings.Append(ext, InPath);
  86.   IF ~noMCtrl
  87.   THEN
  88.     MagicAES.WindUpdate(MagicAES.BEGMCTRL);
  89.   END;
  90.   IF mtDir.GetDir(InPath, InSel, msg) THEN
  91.     IF ~noMCtrl
  92.     THEN
  93.       MagicAES.WindUpdate(MagicAES.ENDMCTRL);
  94.     END;
  95.     mtDir.DelTail(InPath);
  96.     IF pathOnly
  97.     THEN 
  98.       RETURN TRUE
  99.     ELSE
  100.       RETURN LENGTH (InSel) # 0;
  101.     END;
  102.   ELSE
  103.     IF ~noMCtrl
  104.     THEN
  105.       MagicAES.WindUpdate(MagicAES.ENDMCTRL);
  106.     END;
  107.     MagicStrings.Assign(scrapP, InPath);
  108.     MagicStrings.Assign(scrapN, InSel);
  109.     RETURN FALSE
  110.   END
  111. END FselGet;
  112.  
  113. PROCEDURE WithShift (kstate : BITSET) : BOOLEAN;
  114. (* Gibt zurck, ob eine der Shifttasten gedrckt wurde *)
  115. BEGIN
  116.   RETURN (MagicAES.KLSHIFT IN kstate) OR (MagicAES.KRSHIFT IN kstate)
  117. END WithShift;
  118.  
  119. PROCEDURE WithCtrl (kstate : BITSET) : BOOLEAN;
  120. (* Gibt zurck, ob Ctrl gedrckt wurde *)
  121. BEGIN
  122.   RETURN (MagicAES.KCTRL IN kstate)
  123. END WithCtrl;
  124.  
  125. PROCEDURE WithAlt (kstate : BITSET) : BOOLEAN;
  126. (* Gibt zurck, ob Alternate gedrckt wurde *)
  127. BEGIN
  128.   RETURN (MagicAES.KALT IN kstate)
  129. END WithAlt;
  130.  
  131. (* Prototypen *)
  132.  
  133. PROCEDURE OpenOneView (REF fname: ARRAY OF CHAR); FORWARD;
  134.  
  135. (* Fensterhandling *)
  136.  
  137. PROCEDURE clickInView (wdw, vdi : INTEGER; env : ADDRESS; mx, my : INTEGER; kstate, buts : BITSET; clicks :INTEGER): BOOLEAN;
  138. BEGIN
  139.   (* Wir machen nix mit Buttons *)
  140.   RETURN FALSE;
  141. END clickInView;
  142.  
  143. PROCEDURE ChangeTree (view: viewPtr; next: BOOLEAN);
  144.   VAR work : GrafBase.Rectangle;
  145.       tree : mtUtils.tObjcTree;
  146. BEGIN
  147.   WITH view^ DO
  148.     tree := mtRsc.GaddrRsc (rsc, MagicAES.RTREE, treeIdx);
  149.     mtDials.DisposeDial (tree);
  150.     IF next
  151.     THEN
  152.       INC (treeIdx);
  153.       IF treeIdx >= treeCnt THEN treeIdx := 0; END; 
  154.     ELSE
  155.       DEC (treeIdx); 
  156.       IF treeIdx < 0 THEN 
  157.         treeIdx := treeCnt - 1;
  158.       END;
  159.     END;
  160.     tree := mtRsc.GaddrRsc (rsc, MagicAES.RTREE, treeIdx);
  161.     v.bool := mtDials.NewDial (tree);
  162.     WdwManager.GetWdwWork (wdw, work);
  163.     WdwManager.SetScrollParms (wdw, work.w - 16, work.h - 16, 16, 16);
  164.     mtUtils.CalcArea (tree, 0, work);
  165.     WdwManager.SetNewDocument (wdw, GrafBase.LongRect{0, 0, LONG (work.w), LONG (work.h)}, TRUE);
  166.   END;
  167. END ChangeTree;
  168.  
  169. PROCEDURE keyView (wdw, vdi : INTEGER; env: ADDRESS; taste: INTEGER; char, scan : CHAR; kstate : BITSET): BOOLEAN;
  170.   VAR gemCh : CARDINAL;
  171.       key   : MOSGlobals.Key;
  172.       ctrl  : BOOLEAN;
  173.       shift : BOOLEAN;
  174.       done  : BOOLEAN;
  175. BEGIN
  176.   gemCh := ORD(scan) * 256 + ORD(char);
  177.   Keyboard.GemCharToKey (gemCh,  SHORT (INTEGER(kstate)), key);
  178.   ctrl := WithCtrl (kstate);
  179.   shift := WithShift (kstate);
  180.   done := TRUE;
  181.   IF Keyboard.IsSpecial (key)
  182.   THEN
  183.     CASE Keyboard.SpecialKey (key) OF
  184.       left          : WdwManager.ScrollLeft (wdw, 1);  |
  185.       soln          : WdwManager.PageLeft (wdw);    |
  186.       right         : WdwManager.ScrollRight (wdw, 1); | 
  187.       eoln          : WdwManager.PageRight (wdw);   |
  188.       up            : WdwManager.ScrollUp (wdw, 1); |
  189.       down          : WdwManager.ScrollDown (wdw, 1); |
  190.       pgUp          : WdwManager.PageUp (wdw);      |
  191.       pgDown        : WdwManager.PageDown (wdw);    |
  192.       ctrlW         : WdwManager.TopNextWindow(); |
  193.       ctrlO         : OpenOneView(""); |
  194.       ctrlU         : v.bool := WdwManager.CloseWindow (wdw, FALSE); |
  195.       wdLeft        : ChangeTree (env, FALSE); |
  196.       wdRight       : ChangeTree (env, TRUE); |
  197.     ELSE
  198.       done := FALSE
  199.     END;
  200.   ELSE
  201.     done := FALSE;
  202.   END;
  203.   RETURN done;
  204. END keyView;
  205.  
  206. PROCEDURE closeView (wdw, vdi: INTEGER; env : ADDRESS; force : BOOLEAN): BOOLEAN;
  207.   VAR view: viewPtr;
  208.       tree: mtUtils.tObjcTree;
  209. BEGIN
  210.   view := env;
  211.   tree := mtRsc.GaddrRsc (view^.rsc, MagicAES.RTREE, view^.treeIdx);
  212.   mtDials.DisposeDial (tree);
  213.   mtRsc.FreeRsc (view^.rsc);
  214.   DISPOSE (view);
  215.   RETURN TRUE
  216. END closeView;
  217.  
  218. PROCEDURE hideView (wdw, vdi: INTEGER; env : ADDRESS; hide : BOOLEAN);
  219. BEGIN
  220. END hideView;
  221.  
  222. PROCEDURE timerView (wdw, vdi: INTEGER; env : ADDRESS): BOOLEAN;
  223. BEGIN
  224.   RETURN FALSE;
  225. END timerView;
  226.  
  227. PROCEDURE topView (wdw, vdi: INTEGER; env: ADDRESS): BOOLEAN;
  228. BEGIN
  229.   RETURN TRUE
  230. END topView;
  231.  
  232. PROCEDURE untopView (wdw, vdi: INTEGER; env: ADDRESS);
  233. END untopView;
  234.  
  235. PROCEDURE setWork (wdw, vdi: INTEGER; env: ADDRESS; doc: GrafBase.LongRect; slided: BOOLEAN);
  236.   VAR work: GrafBase.Rectangle;
  237. BEGIN
  238.   WdwManager.GetWdwWork (wdw, work);
  239.   WdwManager.SetScrollParms (wdw, work.w - 16, work.h - 16, 16, 16);
  240. END setWork;
  241.  
  242. PROCEDURE getRect (wdw, vdi: INTEGER; env: ADDRESS; VAR r : GrafBase.Rectangle);
  243. END getRect;
  244.  
  245. PROCEDURE redrawView (wdw, vdi : INTEGER; env : ADDRESS; clip : GrafBase.Rectangle);
  246.   VAR view: viewPtr;
  247.       tree: mtUtils.tObjcTree;
  248.       doc : GrafBase.LongRect;
  249.       work: GrafBase.Rectangle;
  250. BEGIN
  251.   view := env;
  252.   WITH view^ DO
  253.     v.int := MagicVDI.SetWritemode (vdi, MagicVDI.REPLACE);
  254.     v.int := MagicVDI.SetFillstyle (vdi, MagicVDI.Full);
  255.     v.int := MagicVDI.SetFillinterior (vdi, MagicVDI.Full);
  256.     v.int := MagicVDI.SetFillcolor (vdi, MagicAES.WHITE);
  257.     work := clip;
  258.     work.w := clip.x + clip.w - 1;
  259.     work.h := clip.y + clip.h - 1;
  260.     MagicVDI.FillRectangle (vdi, work);
  261.     tree := mtRsc.GaddrRsc (rsc, MagicAES.RTREE, treeIdx);
  262.     (* Jetzt positionieren *)
  263.     WdwManager.GetWdwDocument (wdw, doc);
  264.     WdwManager.GetWdwWork (wdw, work);
  265.     tree^[0].obX := work.x - SHORT(doc.x);
  266.     tree^[0].obY := work.y - SHORT(doc.y);
  267.     (* Und zeichnen *)
  268.     mtDials.DialDraw (tree, 0, 8, clip, TRUE);
  269.   END;
  270. END redrawView;
  271.  
  272. PROCEDURE updateView (wdw, vdi: INTEGER; env: ADDRESS; doIt: BOOLEAN);
  273. BEGIN
  274.   IF doIt 
  275.   THEN 
  276.     MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  277.     mtAppl.MouseOff();
  278.   ELSE
  279.     mtAppl.MouseOn();
  280.     MagicAES.WindUpdate (MagicAES.ENDUPDATE);
  281.   END;
  282. END updateView;
  283.  
  284.  
  285. PROCEDURE OpenOneRsc(VAR fullName : ARRAY OF CHAR; VAR rsc : mtRsc.RESOURCE): BOOLEAN;
  286. BEGIN
  287.   
  288.   IF (LENGTH (fullName) > 0) OR
  289.      FselGet (loadPath, loadName, "*.RSC", "Resource laden", FALSE)
  290.   THEN
  291.     IF LENGTH (fullName) = 0
  292.     THEN
  293.       FileNames.ValidatePath (loadPath);
  294.       FileNames.ConcatPath (loadPath, loadName, fullName);
  295.     END;
  296.     IF mtRsc.LoadRsc (fullName, rsc)
  297.     THEN
  298.       RETURN TRUE;
  299.     END;
  300.   END;
  301.   RETURN FALSE;
  302. END OpenOneRsc;
  303.  
  304. PROCEDURE CreateView (VAR view: viewPtr): BOOLEAN;
  305. BEGIN
  306.   NEW (view);
  307.   IF view = NIL THEN RETURN FALSE END;
  308.   WITH view^ DO
  309.     Strings.Assign ("", fileName, v.bool);
  310.     Strings.Assign ("", infoLine, v.bool);
  311.     treeIdx := 0;
  312.     treeCnt := 0;
  313.     wdw := -1;
  314.     vdi := -1;
  315.   END;
  316.   RETURN TRUE;
  317. END CreateView;
  318.  
  319. PROCEDURE OpenOneView (REF fname: ARRAY OF CHAR);
  320.   VAR comps: BITSET;
  321.       work : GrafBase.Rectangle;
  322.       work2: GrafBase.Rectangle;
  323.       view : viewPtr;
  324.       tree : mtUtils.tObjcTree;
  325.       head : mtRsc.RSXHDR;
  326. BEGIN
  327.   IF CreateView(view) 
  328.   THEN
  329.     WITH view^ DO
  330.       IF LENGTH(fname) > 0
  331.       THEN
  332.         Strings.Assign (fname, fileName, v.bool);
  333.       END;
  334.       IF OpenOneRsc (fileName, rsc)
  335.       THEN
  336.         (* Anzahl der B„ume rausfinden *)
  337.         mtRsc.GetRscHeader (rsc, head);
  338.         treeCnt := VAL (INTEGER, head.rshNtree);
  339.         (* Ausmaže des dargestellten Baumes rausfinden *)
  340.         tree := mtRsc.GaddrRsc (rsc, MagicAES.RTREE, treeIdx);
  341.         v.bool := mtDials.NewDial (tree);
  342.         mtUtils.CalcArea (tree, 0, work);
  343.         (* noch clippen *)
  344.         work := RectFuncs.ClipRect (work, deskSize);
  345.         comps := {MagicAES.NAME..MagicAES.HSLIDE};
  346.         MagicAES.WindCalc (MagicAES.WCBORDER, comps, work, work2); 
  347.         INC (work2.x, 40);
  348.         INC (work2.y, 40);
  349.         (* Fenster ”ffnen *)
  350.         IF WdwManager.OpenWindow (clickInView, keyView, timerView, 
  351.                       deskSize,  work2, comps,
  352.                       FALSE, infoLine, fileName, WdwManager.snapProc (NIL),
  353.                       closeView, redrawView, topView,
  354.                       untopView, updateView, setWork, getRect,
  355.                       hideView, 0, view, FALSE, TRUE, TRUE, 
  356.                       TRUE, wdw, vdi)
  357.         THEN
  358.           (* Scrollparameter setzen *)
  359.           WdwManager.SetDocumentParms (wdw, 1, 1);
  360.           WdwManager.GetWdwWork (wdw, work);
  361.           WdwManager.SetScrollParms (wdw, work.w - 16, work.h - 16, 16, 16);
  362.           mtUtils.CalcArea (tree, 0, work);
  363.           WdwManager.SetWdwDocument (wdw, GrafBase.LongRect{0, 0, LONG (work.w), LONG (work.h)});
  364.         END;
  365.       END;
  366.     END;
  367.   END;
  368. END OpenOneView;
  369.  
  370. CONST 
  371.     whatString = '@(#)IconView 1.0, Copyright (c) 1996 Dirk Steins'+0C;
  372.  
  373.   VAR kstate : BITSET;
  374.       taste  : INTEGER;
  375.       scanInt: INTEGER;
  376.       scan,
  377.       ch     : CHAR;
  378.       evnt   : BITSET;
  379.       msgBuf : ARRAY [0..7] OF INTEGER;
  380.       topWdw : INTEGER;
  381.       dr     : GrafBase.Rectangle;
  382.       name   : CatTypes.pathStrType;
  383.  
  384. BEGIN
  385.   WdwManager.GetWdwWork (0, deskSize);
  386.   WdwManager.EnableIconify (TRUE);
  387.   IF mtCommand.ParamCount() > 0 THEN
  388.     FOR scanInt := 1 TO mtCommand.ParamCount() DO
  389.       mtCommand.ParamString (scanInt, name);
  390.       OpenOneView (name);
  391.     END;
  392.   ELSE
  393.     OpenOneView("");
  394.   END;
  395.   REPEAT
  396.      evnt := MagicAES.EvntMulti ({MagicAES.MUKEYBD, MagicAES.MUMESAG},
  397.                               0, {}, {}, 0, dr, 0, dr, msgBuf, 0,0,
  398.                               v.int, v.int, v.bset, taste, 
  399.                               kstate, scanInt, ch, v.int);
  400.     scan := CHAR(SHORT(scanInt));
  401.     IF WdwManager.HandleEvent (evnt, msgBuf, {}, kstate, ch, scan, taste, 0, 0, 0)
  402.     THEN 
  403.     END;
  404.     WdwManager.GetOwnTopWindow (topWdw);
  405.   UNTIL topWdw = -1;
  406. END IconView.
  407.